package com.it.schoolhomeos.service;

import com.it.schoolhomeos.dto.UserDTO;
import com.it.schoolhomeos.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.security.core.userdetails.UserDetailsService;

import java.util.List;

/**
 * 用户服务接口
 * 
 * 定义用户相关的业务逻辑操作
 * 包括用户认证、查询、创建、更新和删除等功能
 */
public interface UserService extends UserDetailsService {
    
    /**
     * 用户登录
     * 
     * @param username 用户名
     * @param password 密码
     * @return 登录成功的用户DTO对象
     * @throws RuntimeException 如果用户名或密码错误
     */
    UserDTO login(String username, String password);
    
    /**
     * 获取当前登录用户信息
     * 
     * @return 当前登录用户的DTO对象
     * @throws RuntimeException 如果用户未登录
     */
    UserDTO getCurrentUser();
    
    /**
     * 根据ID获取用户信息
     * 
     * @param id 用户ID
     * @return 用户DTO对象
     * @throws RuntimeException 如果用户不存在
     */
    UserDTO getUserById(Long id);
    
    /**
     * 根据角色获取用户列表
     * 
     * @param role 用户角色
     * @return 指定角色的用户DTO列表
     */
    List<UserDTO> getUsersByRole(String role);
    
    /**
     * 创建新用户
     * 
     * @param user 用户实体对象
     * @return 创建成功的用户DTO对象
     * @throws RuntimeException 如果用户名已存在
     */
    UserDTO createUser(User user);
    
    /**
     * 更新用户信息
     * 
     * @param user 用户实体对象
     * @return 更新后的用户DTO对象
     * @throws RuntimeException 如果用户不存在
     */
    UserDTO updateUser(User user);
    
    /**
     * 删除用户
     * 
     * @param id 用户ID
     * @throws RuntimeException 如果用户不存在
     */
    void deleteUser(Long id);
    
    /**
     * 检查用户名是否已存在
     * 
     * @param username 用户名
     * @return 如果用户名已存在则返回true，否则返回false
     */
    boolean existsByUsername(String username);
    
    /**
     * 根据用户名查找用户
     * 
     * @param username 用户名
     * @return 用户对象
     */
    User findByUsername(String username);
    
    /**
     * 获取家长用户列表
     * 
     * @param page 页码
     * @param size 每页大小
     * @param keyword 搜索关键词
     * @return 分页的家长用户列表
     */
    Page<User> findParents(int page, int size, String keyword);
    
    /**
     * 根据ID获取家长用户
     * 
     * @param id 家长ID
     * @return 家长用户
     */
    User findParentById(Long id);
    
    /**
     * 创建家长用户
     * 
     * @param user 家长用户信息
     * @return 创建的家长用户
     */
    User createParent(User user);
    
    /**
     * 更新家长用户
     * 
     * @param user 家长用户信息
     * @return 更新后的家长用户
     */
    User updateParent(User user);
    
    /**
     * 删除家长用户
     * 
     * @param id 家长ID
     */
    void deleteParent(Long id);
    
    /**
     * 获取所有家长用户列表
     * 
     * @return 所有家长用户列表
     */
    List<User> findAllParents();
    
    /**
     * 获取教师用户列表
     * 
     * @param page 页码
     * @param size 每页大小
     * @param keyword 搜索关键词
     * @return 分页的教师用户列表
     */
    Page<User> findTeachers(int page, int size, String keyword);
    
    /**
     * 根据ID获取教师用户
     * 
     * @param id 教师ID
     * @return 教师用户
     */
    User findTeacherById(Long id);
    
    /**
     * 创建教师用户
     * 
     * @param user 教师用户信息
     * @return 创建的教师用户
     */
    User createTeacher(User user);
    
    /**
     * 更新教师用户
     * 
     * @param user 教师用户信息
     * @return 更新后的教师用户
     */
    User updateTeacher(User user);
    
    /**
     * 删除教师用户
     * 
     * @param id 教师ID
     */
    void deleteTeacher(Long id);
    
    /**
     * 获取管理员用户列表
     * 
     * @param page 页码
     * @param size 每页大小
     * @param keyword 搜索关键词
     * @return 分页的管理员用户列表
     */
    Page<User> findAdmins(int page, int size, String keyword);
    
    /**
     * 根据ID获取管理员用户
     * 
     * @param id 管理员ID
     * @return 管理员用户
     */
    User findAdminById(Long id);
    
    /**
     * 创建管理员用户
     * 
     * @param user 管理员用户信息
     * @return 创建的管理员用户
     */
    User createAdmin(User user);
    
    /**
     * 更新管理员用户
     * 
     * @param user 管理员用户信息
     * @return 更新后的管理员用户
     */
    User updateAdmin(User user);
    
    /**
     * 删除管理员用户
     * 
     * @param id 管理员ID
     */
    void deleteAdmin(Long id);
    
    /**
     * 更新用户个人信息
     * 
     * @param user 用户信息
     * @return 更新后的用户DTO对象
     */
    UserDTO updateProfile(User user);
    
    /**
     * 修改用户密码
     * 
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     */
    void changePassword(String oldPassword, String newPassword);
    
    /**
     * 更新用户头像
     * 
     * @param avatarUrl 头像URL
     */
    void updateAvatar(String avatarUrl);
} 